![PrivateLinkのエンドポイントサービスでMongoDBを公開してみる #reinvent](https://devio2023-media.developers.io/wp-content/uploads/2014/05/Amazon_VPC.png)
PrivateLinkのエンドポイントサービスでMongoDBを公開してみる #reinvent
こんにちは、菊池です。
先日のアップデートにて、VPCエンドポイントとPrivateLinkを使うことで、他のAWSアカウント/VPCにプライベートなサービスを公開可能になりました。詳細は以下の記事を併せて参照ください。
今回は、この機能を使って、MongoDBをサービス化して他のAWSアカウントから利用してみました。
構成
以下のような構成イメージになります。
MongoDBクラスタをNLBに登録し、別のアカウントからVPCエンドポイント/PrivateLink経由で接続可能にします。
やってみた
以下のような手順で構築します。
- MongoDBクラスタの作成(サービス提供アカウント)
- NLBの作成(サービス提供アカウント)
- VPCエンドポイントサービスへの公開(サービス提供アカウント)
- VPCエンドポイントの作成(サービス利用アカウント)
- VPCエンドポイントサービスの承諾(サービス提供アカウント)
1. MongoDBクラスタの作成
以下の記事の手順にてMongoDBシャードクラスタを作成します。シャード構成とするのは、mongosを利用することでNLB経由でどのインスタンスからもRead/Writeを可能にするためです。
2. NLBの作成
NLBを作成し、1で構成したMongoDBのインスタンスを登録します。
ロードバランサーの作成から、NLBを選択します。
プライベート接続を利用しますので、内部向けを選択します。プロトコルは、MongoDBデフォルトのTCP:27017です。
新規にターゲットグループを作成します。
作成し、インスタンスを登録しました。接続に問題がなければhealthyとなります。healthyにならない場合にはSecurityGroupなどを見直しましょう。
3. VPCエンドポイントサービスへの公開
作成したNLBをエンドポイントサービスに公開します。VPCのメニューから、[エンドポイントサービスの作成]に進みます。
作成したNLBを選択して公開します。
エンドポイントサービスが作成できたら、利用するアカウントをホワイトリストに追加します。エンドポイントサービスを選択し、[ホワイトリストにプリンシパルを追加する]に進みましょう。今回はアカウントに対して許可を与えるため、ARNにarn:aws:iam::xxxxxxxxxxxx:root
を入力して追加します。(xxxxxxxxxxxxはサービスを利用する側のアカウントID)
4. VPCエンドポイントの作成
ここからはサービス利用アカウントでの作業です。VPCのメニューから、VPCエンドポイントの作成に進みます。[サービス名称で検索]を選択します。
3.で作成したエンドポイントサービスのサービス名を入力し[検証]します。
サービスが見つかったら、セキュリティグループを設定し、エンドポイントを作成します。
5. VPCエンドポイントサービスの承諾
サービス提供アカウントに戻ります。
エンドポイント接続が、[承認]の保留中となっていますので、リクエストを承諾しましょう。
確認が出ますので、承諾します。
これで、サービスが利用可能になります。
接続確認
利用側のアカウントで、接続確認してみます。ステータスが利用可能であることを確認しましょう。
エンドポイントを作成したVPCから、DNS名で参照可能になっています。
$ nslookup vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.vpce-svc-xxxxxxxxxxxxxxxx.ap-northeast-1.vpce.amazonaws.com Server: 172.31.0.2 Address: 172.31.0.2#53 Non-authoritative answer: Name: vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.vpce-svc-xxxxxxxxxxxxxxxx.ap-northeast-1.vpce.amazonaws.com Address: 172.31.18.195 Name: vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.vpce-svc-xxxxxxxxxxxxxxxx.ap-northeast-1.vpce.amazonaws.com Address: 172.31.10.116
サブネットごとにENIが配置され、IPが割り当てられています。mongoshellで接続してみます。
$ mongo vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.vpce-svc-xxxxxxxxxxxxxxxx.ap-northeast-1.vpce.amazonaws.com:27017 MongoDB shell version v3.6.1 connecting to: mongodb://vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.vpce-svc-xxxxxxxxxxxxxxxx.ap-northeast-1.vpce.amazonaws.com:27017/test MongoDB server version: 3.6.1 Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2017-12-28T03:34:53.182+0000 I CONTROL [main] 2017-12-28T03:34:53.182+0000 I CONTROL [main] ** WARNING: Access control is not enabled for the database. 2017-12-28T03:34:53.182+0000 I CONTROL [main] ** Read and write access to data and configuration is unrestricted. 2017-12-28T03:34:53.182+0000 I CONTROL [main] 2017-12-28T04:52:54.111+0000 E - [main] Error loading history file: FileOpenFailed: Unable to fopen() file /home/ec2-user/.dbshell: No such file or directory mongos>
接続できました!
まとめ
VPCエンドポイントとPrivateLinkを活用した、MongoDBのプライベートなサービスを構築してみました。これまでは異なるアカウント/VPCにプライベート接続でサービスを提供するためには、VPCピアリングが必要でしたが、この機能を使うことで、VPCのCIDR競合などを気にせずにエンドポイントのみを公開することができます。
これから色々なサービスが出てくることが楽しみですね。